/**
 * @private
 */
Ext.define('Ext.behavior.Draggable', {
    extend: 'Ext.behavior.Behavior',

    requires: [
        'Ext.util.Draggable',
        'Ext.util.translatable.*'
    ],

    setConfig: function(config) {
        var draggable = this.draggable,
            component = this.component,
            listeners = this.listeners;

        if (config) {
            if (!draggable) {
                component.setTranslatable(Ext.apply({
                    type: 'component',
                    component: component,
                    element: component.element
                }, config.translatable));
                this.draggable = draggable = new Ext.util.Draggable(config);
                draggable.setComponent(component);
                draggable.setTranslatable(component.getTranslatable());
                draggable.setElement(component.renderElement);
                draggable.on('destroy', 'onDraggableDestroy', this);

                if (listeners) {
                    component.on(listeners);
                }
            }
            else if (Ext.isObject(config)) {
                draggable.setConfig(config);
            }
        }
        else if (draggable) {
            draggable.destroy();
        }

        return this;
    },

    getDraggable: function() {
        return this.draggable;
    },

    onDraggableDestroy: function() {
        delete this.draggable;
    },

    onComponentDestroy: function() {
        var draggable = this.draggable;

        if (draggable) {
            draggable.destroy();
        }
    }
});
